#include "parseAdList.h"
#include <gio/gio.h>
#include <stdio.h>
#include <glib.h>
#include "curlRequest.h"
#define RES_PATH "/home/ly/test/media" //资源下载路径

Ad *parseItem(cJSON* item);//解析parseAdList中传递的cjson对象
Ad* parseUpDownSplitScr(cJSON* item);//处理parseItem中的上下分屏的广告
int downloadAdsAndGenLocalAdListToSqlite(Ad* ads[],int size); //用于从服务器下载资源


//处理路径
char* getResPath(AdResource *ar){
    //1.取出外键 广告的id
    int adId =ar->ad_id;
    //2.取出网络的path路径
    char *path =ar->path;// http://47.109.65.208/images/video/44.mp4
    //3.获取对应的文件的真实名字
    gchar *fileName= g_path_get_basename(path);// 44.mp4
    
    //4.准备一个用来格式化模板
    char *farmatStr="%s/%d_%s";
    // /home/heron/ronghua-ads/media/1_44.mp4
    return g_strdup_printf(farmatStr,RES_PATH,adId,fileName);
}


void parseAdList(cJSON* ad_list){
    //ad_list是一个数组
    if (cJSON_IsArray(ad_list))
    {
        //如果是数组，就获取数组大小
        int size = cJSON_GetArraySize(ad_list);
        Ad* ads[size]; //存放最终解析后的ad_list数据
        //遍历数组获取数据
        for (int i = 0; i < size; i++)
        {
            cJSON* item = cJSON_GetArrayItem(ad_list,i);
            //解析item对象
            Ad* ad = parseItem(item);
            //将解析到的数据存放到ads中
            ads[i] =ad;//这时候ad里存放的就是服务端传递过来的数据，里面有资源的地址，分屏类型等各种数据
        }

         //完成数据的存储，文件的处理
         //2 打印远程播放列表j
        for (int i = 0; i < size; i++){
            Ad* ad= ads[i];
            if (ad==NULL)
            {
                continue;
            }

            printf("id=%d,template_id=%d\n",ad->id,ad->templateId);
           for (int j = 0; j < 3; j++)
           {
               AdResource *ar = ad->resources[j];
               if (ar==NULL)
               {
                  continue;
               }  
               printf("id=%d,path=%s,sign=%s\n",ar->id,ar->path,ar->sign);
           }
           printf("==========================\n");   
        }

        //进行资源下载等操作，将资源下载到本地
        int result = downloadAdsAndGenLocalAdListToSqlite(ads,size);

         //根据result的返回情况通知qt进程---进程之间的通讯


        //4 释放new出来相关广告的资源
         for (int i = 0; i < size; i++)
        {
            Ad *ad =  ads[i];
            printf("adid=%d\n",ad->id);
            for (int i = 0; i < 3; i++)
            {
                AdResource *ar = ad->resources[i];
                if (ar!=NULL)
                {
                    g_print("url=%s\n",ar->path);
                    free(ar);
                }
            }
            free(ad);
        }

        //5 如果有新的广播，通知QT进程重新加载播放列表
        if (result==1)
        {
           printf("发通知给QT进程加载本地播放列表！\n");
        }else{
           printf("没有新的广告！\n");
        }
        
    }
    
}

Ad *parseItem(cJSON* item){
    Ad* result;//返回处理后的对象
    //用于解析item对象，获取到template_id 从而知道是什么模板的广告模式，有上下分屏，左右分屏，上中下分屏等模式
    //取出template_id
    cJSON* template_id = cJSON_GetObjectItem(item,"template_id");
    int id = template_id->valueint;
    //根据不同的模式进行处理
    switch (id)
    {
    case 1:
        
        break;
    case 2:
        
        break;
    case 3:
        
        break;
    case 4:
        
        break;
    case 5:
        
        break;
    case 6:
        //处理上下分屏的广告
        result=parseUpDownSplitScr(item);
        break;
    
    default:
        break;
    }
    return result;
}

Ad* parseUpDownSplitScr(cJSON* item){
    //处理上下分屏的广告模式
    /*
                "id":1,
                "template_id":6,
                "customer_id":1,
                "top_media_type_id":1,
                "top_media_url":"http://localhost:80/1.mp4",
                "top_media_sign":"jfjjfjfjj",
                "buttom_media_type_id":2,
                "buttom_media_url":"http://localhost:80/add.png",
                "buttom_media_sign":"jfjjfjfjj",
                "start_time": "2024-06-01 00:00:00",
                "end_time": "2024-06-30 23:59:59",
                "state":0
    */

    //解析出item中所有的数据
    cJSON* id = cJSON_GetObjectItemCaseSensitive(item,"id");
    cJSON* template_id = cJSON_GetObjectItemCaseSensitive(item,"template_id");
    cJSON* customer_id = cJSON_GetObjectItemCaseSensitive(item,"customer_id");
    cJSON* top_media_type_id = cJSON_GetObjectItemCaseSensitive(item,"top_media_type_id");
    cJSON* top_media_url = cJSON_GetObjectItemCaseSensitive(item,"top_media_url");
    cJSON* top_media_sign = cJSON_GetObjectItemCaseSensitive(item,"top_media_sign");
    cJSON* buttom_media_type_id = cJSON_GetObjectItemCaseSensitive(item,"buttom_media_type_id");
    cJSON* buttom_media_url = cJSON_GetObjectItemCaseSensitive(item,"buttom_media_url");
    cJSON* buttom_media_sign = cJSON_GetObjectItemCaseSensitive(item,"buttom_media_sign");
    cJSON* start_time = cJSON_GetObjectItemCaseSensitive(item,"start_time");
    cJSON* end_time = cJSON_GetObjectItemCaseSensitive(item,"end_time");
    cJSON* state = cJSON_GetObjectItemCaseSensitive(item,"state");

    //将这些数据存放到资源对象中
    Ad *result = calloc(1,sizeof(Ad));
    result->templateId = template_id->valueint;
    result->customerId = customer_id->valueint;
    result->start_time = start_time->valuestring;
    result->end_time = end_time->valuestring;
    result->id= id->valueint;

    AdResource* upAdres =  calloc(1,sizeof(AdResource));
    upAdres->path = top_media_url->valuestring;
    upAdres->sign = top_media_sign->valuestring;
    upAdres->type_id = top_media_type_id->valueint;
    upAdres->index = 0;//用于广告播放先后顺序
    upAdres->ad_id = id->valueint;
    result->resources[0] = upAdres;

    AdResource* buttomAdres =  calloc(1,sizeof(AdResource));
    buttomAdres->path = buttom_media_url->valuestring;
    buttomAdres->sign = buttom_media_sign->valuestring;
    buttomAdres->type_id = buttom_media_type_id->valueint;
    buttomAdres->index = 1;//用于广告播放先后顺序
    buttomAdres->ad_id = id->valueint;//就是整条广告的id
    result->resources[1] = buttomAdres;

    result->resources[2] = NULL;
    
    return result;
}

/**
 * 返回值 int 如果是 1 就代表 需要通知at进程重新加载播放列表，此时有广告更新情况
 * 
 *
 */


int downloadAdsAndGenLocalAdListToSqlite(Ad* ads[],int size){
    //决定是否要通知qt进程重新加载数据标识
    int result=0;
    //1.循环ads数据
    for (int i = 0; i <size; i++)
    {
        //1.根据ad的id去数据库查询数据
        Ad *ad= ads[i];
        //取出id 
        int adId =  ad->id;
        Ad  *adInDb= getAd(adId);
        //2.根据数据有没有左判断分流
        if (adInDb==NULL)//当前的数据没有存储到本地的数据
        {
            result=1;//qt重新要加载数据
            //先把ad保存到数据库
            saveAd(ad);
            //处理需要保存的资源数据            
            for (int j = 0; j < 3; j++)
            {
                AdResource *ar = ad->resources[j];
                if (ar!=NULL)
                {
                    //把媒体资源下载到本地，并且把  AdResource  的path替换为本地存储的路径
                    //http://47.109.65.208/images/video/44.mp4
                    char* resPath = getResPath(ar); ///home/heron/ronghua-ads/media/1_44.mp4
                    if(!g_file_test(resPath,G_FILE_TEST_EXISTS)){
                       //创建文件
                        GFile  *file = g_file_new_for_path(resPath);
                        g_print("%s\n",resPath);
                        // // 使用GFile对象创建文件，如果文件已存在则不进行任何操作
                        if (!g_file_create(file, 0, NULL,NULL))
                        {
                            g_print("create file error!\n");
                        }         
                    }   
                    //下载文件到本地
                    downloadRes(ar->path,resPath);
                    //把原来的网络地址替换为本地地址
                    ar->path=resPath;
                    //保存数据到数据库    
                    saveAr(ar);
                }                

            }
            
        }else{//数据库有数据
            //1.更新本地的ad 防止有时间的变化
            
            updateAd(ad);
            //处理广告的资源
            for (int j = 0; j < 3; j++)
            {              
                AdResource *ar= ad->resources[j];
                if(ar!=NULL){
                    //获取加密的串
                    char *signOnLine= ar->sign;
                    char *resPath= getResPath(ar);
                    //获取当前资源对应的文件进行加密以后 标识
                    /*
                        找到当前的文件的 AdResource  path里面存储的就是本地文件的路径  再使用md5进行加密
                    */
                    //char *localSign= md5(resPath);
                    char *localSign="jfjjfjfjjjjjjj";

                    if(!g_str_equal(signOnLine,localSign)){
                    
                        //下载文件
                        downloadRes(ar->path,resPath);
                        //把原来的网络地址替换为本地地址
                        ar->path=resPath;
                        //保存数据到数据库    
                        updateAr(ar);
                        result=1;
                    }else{
                        //数据不需要更新
                        printf("数据无需更新");
                    }
                }
            }
            
        }//数据库有数据结束
            
    }
    

    return result;
}